The latest posts in full-text for feed readers.
The 2nd floor needed an additional wifi access point, and so I purchased a used Zyxel NWA90AX for 60€ on kleinanzeigen.de.
Before buying I checked that it is supported by OpenWrt and found that NWA90AX Pro is supported, but it uses a totally different chipset. The NWA50AX is also supported and has the same hardware as the NWA90AX:
NWA90AX: Identical hardware as in NWA50AX, but with added features like Captive portal for Guest access and WPA Enterprise for AD/Radius (Credential) authentication.
I followed the NWA50AX instructions (especially flashing the vendor firmware to get the Current Image to 1), but then flashing failed with:
errno: -25007
errmsg: Firmware content error!
I immediately suspected that the firmware contains a list of compatible models, but needed 5 days and many detours to - accidentially - find the model code 77 e1 of the NWA90AX.
Now the access point provides beautiful 5 + 2.4 GHz wireless lan with the latest OpenWrt firmware. The patch that adds support is awaiting review.
I downloaded every available NWA50AX and NWA90AX firmware to check which 50 version I can flash over the same 90 version.
Version | NWA50AX | NWA90AX |
---|---|---|
6.25(8) | NWA50AX_6.25(ABYW.8)C0.zip | |
6.27(2) | - | NWA90AX_6.27(ACCV.2)C0.zip |
6.29(3) | NWA50AX_6.29(ABYW.3)C0.zip | NWA90AX_6.29(ACCV.3)C0.zip |
6.29(4) | NWA50AX_6.29(ABYW.4)C0.zip | NWA90AX_6.29(ACCV.4)C0.zip |
7.00(1) | - | NWA90AX_7.00(ACCV.1)C0.zip |
7.00(2) | NWA50AX_7.00(ABYW.2)C0.zip | NWA90AX_7.00(ACCV.2)C0.zip |
7.10(1) | - | NWA90AX_7.10(ACCV.1)C0.zip |
7.10(3) | NWA50AX_7.10(ABYW.3)C0.zip | NWA90AX_7.10(ACCV.3)C0.zip |
Only the latest V7.10(3) was the one whose 50 version I could flash onto my 90 hardware.
While installing the firmware versions, I had the browser developer console's network tab open and saw the following:
## Checking hash(es) for FIT Image at 752a9000 ... Hash(es) for Image 0 (script): sha256+ Hash(es) for Image 1 (Bootloader): sha256+ Hash(es) for Image 2 (firmware): sha256+ Hash(es) for Image 3 (rootfs_data): sha256+ Hash(es) for Image 4 (logs): sha256+ Hash(es) for Image 5 (myzyxel): sha256+ Hash(es) for Image 6 (bootconfig): sha256+ Hash(es) for Image 7 (mrd): sha256+ Content-Type: text/html <html><head></head><body> var zyshdata0=[{'_model':'NWA90AX','_firmware_version':'V6.29(ACCV.4)','_build_date':'2024-01-10 14:37:56'}]; var errno0=0; var errmsg0='OK'; </body></html> Upgrade started Current time: Sat Sep 27 15:54:56 DGMT 2025 ----- kernel cmdline ----- console=ttyS0,115200 loglevel=1 bootImage=1 bootVer=V1.03 rootfstype=squashfs,jffs2 ------- FW version ------- FIRMWARE_VER=6.29(ACCV.4) BUILD_DATE=2024-01-10 14:37:56 MODEL_ID=NWA90AX COMPATIBLE_PRODUCT_MODEL_0=77E1 COMPATIBLE_PRODUCT_MODEL_1=FFFF COMPATIBLE_PRODUCT_MODEL_2=FFFF COMPATIBLE_PRODUCT_MODEL_3=FFFF COMPATIBLE_PRODUCT_MODEL_4=FFFF
I don't know if that was a bug in this specific firmware, but the upgrade log was sent to the browser - not only the part within the <html>. But this was where I found the NWA90AX's model code.
Published on 2025-10-05 in hardware
Mit dem Gesetz zur Digitalisierung der Energiewende vom August 2016 wurden Messstellenbetreiber dazu verpflichtet, daß
[...] ab 2017 innerhalb von acht Jahren alle Messstellen an Zählpunkten mit einem Jahresstromverbrauch über 10 000 bis einschließlich 20 000 Kilowattstunden mit einem intelligenten Messsystem ausgestattet werden [...]
Gesetz über den Messstellenbetrieb und die Datenkommunikation in intelligenten Energienetzen - §31, Punkt 1.4
Da meine Wärmepumpe bei ~11.000 kWh pro Jahr liegt, hätte ich bis 2025 angeschlossen werden müssen. Ende August 2025 habe ich von einem Subauftragnehmer der Mitnetz ein intelligentes Messystem installiert bekommen, d.h. einen digitaler Stromzähler mit angeschlossenem Smart Meter Gateway, der den Stromverbrauch alle 15 Minuten nach Hause sendet.
Die Zählerdaten wollte ich lokal abrufen und in meine Volkszähler-Instanz einspeisen - dort landen auch schon die Daten des Hausstromzählers, der schaltbaren Steckdosen und der Waschmaschine.
Der digitale Stromzähler ist ein Landis Gyr E320 Zweirichtungszähler, an den ein Smart Meter Gateway (SMGW) vom Typ Theben Conexa 3.0 angeschlossen ist. Da es im Zählerschrank nicht so guten Empfang gibt, hat der Installateur zusätzlich eine LTE-Antenne angeschlossen.
Das eigentlich schöne ist aber, daß es einen RJ45-Netzwerkanschluss gibt, der mit "HAN" - Home Area Network - betitelt ist.
Meine Kommunikationsversuche mit ihm schlugen aber alle fehl; ein Ping-Scan brachte keine Ergebnisse. Über die Netzwerkschnittstelle kamen keine Daten - nicht mal eine DHCP-Anfrage nach einer IP-Adresse. Im Handbuch steht dann folgendes:
Die IP-Adresse der HAN-Schnittstelle wird durch den Betreiber/Verwender zur Verfügung gestellt.
Da wir in digitalen Zeiten leben dachte ich mir, daß man die Zugangsdaten bestimmt online einsehen kann und registrierte mich im Kundenportal für Netzkunden - nur um festzustellen, daß es dort keine Zugangsdaten gibt.
Die restlichen Portale auf der Portale & Services-Seite der Mitnetz klangen nicht so, als sind sie für mich geeignet.
Dann las ich den Brief von der Mitnetz nochmal:
Ihr neuer Zähler ist mit dem Messdatenportal der MITNETZ STROM verbunden. Das hat für Sie den Vorteil, dass Sie Ihre Messdaten jederzeit genau im Blick haben können. Was ist dafür zu tun? Melden Sie sich nach dem Einbau einfach im Kundenportal der MITNETZ STROM unter meine.mitnetz-strom.de für diesen kostenfreien Service an.
Das "Kundenportal" unter dieser Adresse ist die
AppC App im Online-ANA & Extranet
für Installateure und Planungsbüros
, für das ich mich natürlich neu registrieren musste.
Dort gibt es einen Punkt Meine Apps > Messdaten, hinter dem
ein Formular hängt:
Sie möchten die Verbrauchswerte Ihres intelligenten Messsystems einsehen?
.
Nachdem ich das abgeschickt hatte, bekam ich 2 Tage später 3 E-Mails: Eine mit dem Benutzernamen, eine zweite mit dem Passwort, und die dritte mit der URL für das dritte Kundenportal: Das "Ecount Webportal" unter edm.mitnetz-strom.de.
Im Ecount-Webportal gibt es - neben der Anzeige der aktuellen Verbrauchsdaten - auch einen Menüpunkt "HAN", unter dem man Benutzernamen des Stromzählers sieht und das Passwort setzen kann.
Das Formular war bei mir deaktiviert, weil meinem Account das Smart Meter Gateway nicht zugeordnet war:
Es wurde kein zugeordnetes SMGW gefunden.
Ich schrieb eine E-Mail an den Support, und 2 Wochen später konnte ich den Benutzernamen sehen (004747572657_ECPR0000476734) und ein Passwort setzen. Nach ca. 45 Minuten war das Passwort dann auf das SMGW übertragen. Vorher stand da:
Das HAN-Passwort wird in Kürze gesetzt.
und
Das HAN-Passwort kann nicht gesetzt werden. Ein Auftrag zum Setzen des Passwortes liegt bereits vor.
Es werden sogar für das SMGW komplexe Passwörter verlangt:
Passwortrichtlinien
- Mindestens 10 und maximal 32 Zeichen
- Mindestens einen Kleinbuchstaben
- Mindestens einen Großbuchstaben
- Mindestens eine Ziffer
- Mindestens ein Sonderzeichen. Zulässig sind: !/()=?+*~#',;.:-_
Initial hatte ich per E-Mail um die Zugangsdaten zum SMGW gebeten, nur um dann per Post die PIN für den digitalen Stromzähler zu bekommen.
Um das abzukürzen, hatte ich dann den Support angerufen (am Sonnabend - das ist noch Service!) und daraufhin eine E-Mail mit Hinweisen zum Zugriff erhalten:
Um die HAN-Schnittstelle des Gateways zu nutzen und die auf dem Gateway gespeicherten Daten abrufen können, stehen Ihnen zwei Möglichkeiten zur Verfügung.
Bitte beachten Sie, dass die IP-Adresse für die HAN-Schnittstelle des Gateways mit 192.168.1.200 fest vorgegeben ist.
1. Möglichkeit:
Eine vom Hersteller entwickelte Oberfläche, wo die abgespeicherten Messwerte abrufbar sind.
https://192.168.1.200/cgi-bin/hanservice.cgi
Für die Anmeldung nutzen Sie bitte folgende Nutzerdaten:
1. Der Benutzername ist voreingestellt und wird Ihnen im Visualisierungsportal unter dem Reiter "HAN" angezeigt.
2. Das Kennwort vergeben Sie sich bitte im Visualisierungsportal unter dem Reiter "HAN".
2. Möglichkeit
Über die sogenannte TruDi (transparent- und Display-Software) können Sie sich ebenfalls die im Gateway gespeicherten Messwerte über die HAN-Schnittstelle ansehen. Der Vollständigkeit halber erhalten Sie den Link zur Seite der Physikalisch Technischen Bundesanstalt (PTB), wo neben der Software TruDi auch die Bedienungsanleitung heruntergeladen werden kann.
https://www.ptb.de/cms/de/ptb/fachabteilungen/abt2/fb-23/ag-234/info-center-234/trudi.html
Für die Anmeldung benötigen Sie neben den oben benannten, folgende Informationen:
3. IP-Adresse: 192.168.1.200,
4. Port: 443.
Es gibt keine Möglichkeit, die IP-Adresse anzupassen.
Da auch die Subnetzmaske des SMGW nicht änderbar ist, kommt man mit der Änderung der eigenen Subnetzmaske auch nicht weit - die Pakete kommen dann zwar zum SMGW, aber nicht zurück. Man muss deshalb unbedingt eine Adresse im 192.168.1.x-er Netz haben, um auf das Gateway zugreifen zu können.
Mein Heimnetz liegt im Bereich 192.168.3.x, deshalb musste ich meinem Homeserver eine zweite IPv4-Adresse geben.
Jetzt war der Weg frei, um an den aktuellen Stromverbrauch der Wärmepumpen zu kommen! Ich öffnete https://192.168.1.200/ im Browser, tippte Benutzernamen und Passwort ein und ... sah das:
Das wars! Keine Messdaten, keine Netzwerkinformationen, nichts. Nicht einmal das Ergebnis des Selbsttests kann man über das Interface abrufen.
Pfui, Theben Smart Energy.
Auch der versprochene hanservice.cgi ist nicht verfügbar.
Glücklicherweise sind die Geräte mit einer API ausgestattet, die auch von der TRuDi-Software genutzt wird. Mit dieser Software war es möglich, die Zählerdaten abzurufen.
Ich fand das smgw-theben-conexa-Projekt auf GitHub, welches eine Kopie der API-Dokumentation Schnittstellenbeschreibung IF_GW_CON.pdf enthält. Damit hatte ich alle notwendigen Informationen.
Den URL-Pfadteil ecpr0000476738.sm habe ich aus der URL des Web-Interface kopiert.
$ curl -s --digest -k --user "username:passwort"\
-XPOST -H 'Content-type: application/json'\
https://192.168.1.200/smgw/m2m/ecpr0000476738.sm/json\
--data '{"method":"smgw-info"}'\
| jq .
{
"elapsed-time": "28 miliseconds",
"method": "smgw-info",
"smgw-info": {
"certificates": {
"han": {
"tls": "2d2d2d2d2[...]"
},
"wan": [
{
"cert-index": "0",
"sig": "308203be[...]",
"sub-ca": "308204373[...]"
},
{
"cert-index": "1",
"sig": "308203c130[...]",
"sub-ca": "3082042b3[..]"
}
]
},
"firmware-info": {
"component": "Firmware",
"hash": "bff7b08c0b6669be02fece905da7acc7c92b73a53c992893d1e19673e7dd1cfd",
"version": "v3.80.3-cc"
},
"smgw-id": "ethe0300427561",
"smgw-state": "a0000000",
"smgw-time": "2025-10-03T11:21:57"
},
"version": "1.3.0"
}
$ curl -s --digest -k --user "username:password"\
-XPOST -H 'Content-type: application/json'\
https://192.168.1.200/smgw/m2m/ecpr0000476738.sm/json\
--data '{"method":"log","fromtime":"2025-10-03T11:20:00"}'\
| jq .
{
"elapsed-time": "19 miliseconds",
"log": {
"entries": [
{
"event-id": "13003",
"event-sub-id": "0",
"index": "2439",
"level": "6",
"message": "Die Systemzeit wurde mit der gesetzlichen Zeit synchronisiert. Die neue Zeit ist 2025-10-03T11:20:49+02:00. Die alte Zeit war 2025-10-03T11:20:49+02:00. Die Differenz betrug 22 Millisekunden.",
"outcome": "0",
"subject-identity": "01005e3180a0.ethe0300427561.sm",
"time": "2025-10-03T09:20:50Z",
"user-identity": "01005e318011.ecpr0000476738.sm",
"vendor-id": "PTB",
"version": "1"
}
],
"records": "1"
},
"method": "log",
"version": "1.3.0"
}
Hier wird es interessant, weil wir für das Auslesen die usage-point-id benötigen. Bei mir gibt es 2 "usage points": Der erste gruppiert monatlich und deshalb wenig "billing-Periods"; der zweite gruppiert nach Tagen:
$ curl -s --digest -k --user "username:password"\
-XPOST -H 'Content-type: application/json'\
https://192.168.1.200/smgw/m2m/ecpr0000476738.sm/json\
--data '{"method":"user-info"}'\
| jq .
{
"elapsed-time": "781 miliseconds",
"method": "user-info",
"user-info": {
"usage-points": [
{
"billing-Periods": [
{
"end-time": "2025-08-31T22:00:00Z",
"start-time": "2025-08-29T10:30:01Z"
},
{
"end-time": "2025-09-30T22:00:00Z",
"start-time": "2025-08-31T22:00:00Z"
},
{
"start-time": "2025-09-30T22:00:00Z"
}
],
"capture-time": "00:00:00",
"delivery-id": "ecpr0000476735",
"end-time": "",
"meter": [
{
"meter-id": "1lgz0082488485"
}
],
"metering-point-id": "DE0010810480800000000000000088119",
"on-demand-profile-configured": "true",
"start-time": "2025-08-29T10:30:01Z",
"taf-number": "1",
"taf-state": "running",
"usage-point-id": "01005e318021.taf014042805000706de0010810480800000000000000088119000000305185.sm",
"usage-point-name": "IM4G_TAF01_15MI_MON_MON"
},
{
"billing-Periods": [
{
"end-time": "2025-08-29T22:00:00Z",
"start-time": "2025-08-29T10:30:01Z"
},
[...]
{
"end-time": "2025-10-01T22:00:00Z",
"start-time": "2025-09-30T22:00:00Z"
},
{
"end-time": "2025-10-02T22:00:00Z",
"start-time": "2025-10-01T22:00:00Z"
},
{
"start-time": "2025-10-02T22:00:00Z"
}
],
"capture-time": "00:00:00",
"delivery-id": "ecpr0000476735",
"end-time": "",
"meter": [
{
"meter-id": "1lgz0082488485"
}
],
"metering-point-id": "DE0010810480800000000000000088119",
"on-demand-profile-configured": "true",
"start-time": "2025-08-29T10:30:01Z",
"taf-number": "7",
"taf-state": "running",
"usage-point-id": "01005e318027.taf074042805000706de0010810480800000000000000088119000000305184.sm",
"usage-point-name": "IM4G_TAF07_15MI_15MI_DAY"
}
]
},
"version": "1.3.0"
}
Ich hab mir "usage point" mit der täglichen Gruppierung ausgesucht.
Mit der usage-point-id kann man sich Verbrauchsdaten über einen Zeitraum abholen, oder aber nur den letzten Zählerwert:
$ curl -s --digest -k --user "username:password"\
-XPOST -H 'Content-type: application/json'\
https://192.168.1.200/smgw/m2m/ecpr0000476738.sm/json\
--data '{"method":"readings","database":"origin","last-reading":true,"usage-point-id":"01005e318027.taf074042805000706de0010810480800000000000000088119000000305184.sm"}'\
| jq .
{
"elapsed-time": "26 miliseconds",
"method": "readings",
"readings": {
"channels": [
{
"obis": "0100010800ff",
"readings": [
{
"capture-time": "2025-10-03T09:29:57Z",
"cosem-status": "a000000020803800",
"meter-status": "20803800",
"owner-number": "1lgz0082488485.sm",
"signature": "91ba8abd883[...]",
"smgw-status": "a0000000",
"target-time": "2025-10-03T09:30:00Z",
"value": "4075668"
}
]
}
],
"records": "1"
},
"version": "1.3.0"
}
Die 4075668 sind 407,5668 kWh.
Der Smart Meter Gateway wird auf dieselbe Weise eingebunden, wie ich es schon mit den Shelly Plug S gemacht hatte.
Zuerst im Webinterface des Volkszählers einen neuen Kanal anlegen:
Nach dem Anlegen wird eine Kanal-ID angezeigt; diese braucht man jetzt bei der vzlogger-Konfiguration im meters-Abschnitt:
//wärmepumpen
{
"protocol": "exec",
"enabled": true,
"allowskip": true,
"interval": 300,
"command": "curl -s --digest -k --user \"username:password\" -XPOST -H 'Content-type: application/json' https://192.168.1.200/smgw/m2m/ecpr0000476738.sm/json --data '{\"method\":\"readings\",\"usage-point-id\":\"01005e318027.taf074042805000706de0010810480800000000000000088119000000305184.sm\",\"database\":\"origin\",\"last-reading\":true}' | jq -r '[\"total\", .readings.channels[].readings[].value] | join(\" \")'",
"format": "$i $v",
"channels": [
{
"uuid": "a9cc7410-a01f-11f0-bd17-a9f5d1d0316e",
"middleware": "http://strom.home.cweiske.de/middleware.php",
"identifier": "total",
"aggmode": "max"
}
]
},
Jetzt den vzlogger neustarten und die Daten fließen alle 5 Minuten in die Datenbank.
Rupert schrieb auf volkszaehler-users, daß das SMGW die Daten nur alle 15 Minuten abliest. Wenn man sich die Graphen genauer anschaut, dann stimmt das auch :( Das interval kann deshalb auf 900 geändert werden.
Published on 2025-10-03 in hardware, haus
In the 2012 Hydrogen Sonata culture novel, Iain M. Banks lets the main character lose interest in learning a musical instrument when the artificial intelligence of a star ship plays the instrument perfectly - just because it is jealous of her:
She duly lost the desire to play the elevenstring; misplaced it for about fifteen years following that performance by the carelessly perfect cobbled-together artificial version of an absurd-looking alien.
What was the point of taking the time learning to play anything as well as you could, when a machine could use something it would think of as little better than its hand puppet to play so achingly, immaculately, ravishingly well, exactly as though it was the creature that had spent a lifetime studying, understanding and empathising with the instrument and all that it signified and meant?
That was 10 years before ChatGPT.
In Use of weapons from 1990 he answers the question:
"Can't machines build these faster?" he asked the woman, looking around the starship shell.
"Why, of course!" she laughed.
"Then why do you do it?"
"It's fun. You see one of these big monsters sail out those doors for the first time, heading for deep space, three hundred people on board, everything working, the Mind quite happy, and you think; I helped build that.
The fact a machine could have done it faster doesn't alter the fact that it was you who actually did it."
Published on 2025-09-27 in books, leben
A week ago I noticed a high CPU load on my web server and found that 4 CPUs were busy executing tasks created by my WebSub server implementation phubb.
Upon further investigation I found that there were ~1500 remote IP addresses sending ~3500 ping requests per minute to my server. Each request spawned a background process, leading to the high server load.
The source IPs were split geographically across a couple dozen of countries, the top 5 being:
59 | IR, Iran, Islamic Republic of |
64 | RO, Romania |
311 | GB, United Kingdom |
123 | UA, Ukraine |
1000 | US, United States |
The feed URLs for which update pings were sent to my server were e.g. http://romareis.nl/atom320756.xml and many more domains.
When opening the URLs listed inside the feed with a browser, they redirected to bt-fr-cl.com and some subpath. This seems to be a tracking service that counts link clicks, which might give an explanation for the spam attack: Get links to those URLs visible to many eyes and have people click on them, to get ad revenue or even getting paid per click.
I added a whitelist to phubb and now only allow pings and subscriptions for cweiske.de.
Fuck you, spammers. I wish you a slow and painful death.
Published on 2025-09-19 in bigsuck, web
Das Wurzener Gymnasium nutzt beste.schule als digitales Notenbuch. Mit Beginn des Schuljahres 2025/26 wollte ich mich dort anmelden um zu sehen, ob es schon irgendetwas Neues gibt.
Auf https://beste.schule/login funktionierten meine Zugangsdaten nicht mehr; ich bekam den Fehler
Diese Kombination aus Zugangsdaten wurde nicht in unserer Datenbank gefunden.
Der Support verwies mich an die Admins des Gymasiums, die mir antworteten,
daß es eine technische Panne
gab
durch die wir die Schlüssel neu vergeben müssen
.
Auf Nachfrage wurde mir mitgeteilt, daß es
zur leider endgültigen Entknüpfung von Konten und Nutzern gekommen ist
.
Das Magnus-Gottfried-Lichtwer-Gymnasium hat ~700 Schüler und genauso viele Eltern. Mindestens 1400 Personen benötigten also neue Codes, um ihren beste.schule-Account mit den Schülerdaten zu verknüpfen.
Die Verteilung der vielen Zettel mit den Codes war - im Vergleich mit dem Einspielen von Backups - der offenbar einfachere Weg. Hier muss beste.schule besser werden.
Published on 2025-09-19 in leben
After several months of work the community GameStick server has a HTML interface that lets you browse all the 188 games available for the GameStick.
On a desktop browser, the UI looks like the original marmalade-based GameStick interface. Use a smart phone or tablet device and the website looks a like a typical modern mobile web page.
The web interface has a couple of improvements over the old UI: You may filter games by genre and features - it's easy to find games for 2 players for some couch co-op, or platformer or racing games.
Published on 2025-09-03 in gamestick, html, web
Seit Jahren schon zeichne ich den Gesamtstromverbrauch des Hauses direkt von unserem Stromzähler mit Hilfe eines Optokopfes auf. Die niedrigsten Verbrauchswerte sind um die 150 Watt, darunter liegt der Stromverbrauch niemals. Ich wollte nun herausfinden, wo der ganze Strom verbraucht wird.
Von Weihnachten hatte ich noch ein paar Shelly Plug S-Zwischenstecker rumliegen. Diese kann man nicht nur per HTTP-Befehlen an- und ausschalten, sondern sie messen auch die verbrauchte Energie und bieten eine HTTP-basierte API zum Abruf des Verbrauchs: /meter/0.
Zur Datenaufzeichnung und Visualisierung nutze ich den Volkszähler. Der vzlogger wird alle 10 Minuten per cron gestartet, liest die Daten vom Stromzähler aus und schreibt sie dann in die "Middleware", die die Daten in die Datenbank wirft. Die Ausgabe erfolgt per volkszähler-Webinterface im Browser:
Bevor man den Logger konfigurieren kann, muss im Webinterface ein neuer Kanal angelegt werden. Also Kanal hinzufügen und dann Kanal erstellen und folgende Einstellungen vornehmen:
Der Rest ist nach Belieben wählbar.
Hat man den Kanal angelegt bekommt man eine UUID, die man sich merken bzw. in eine Textdatei kopieren sollte - man braucht sie für die Loggerkonfiguration.
Der vzlogger muss die Daten vom Shelly abrufen. Dazu habe ich im "meters"-Abschnitt der vzlogger.conf-Datei ein neues Gerät angelegt:
Das Protokoll ist "exec", weil ein Befehl ausgeführt werden soll. Hier ist ganz wichtig, daß der vzlogger nicht als root laufen darf, weil das exec dann (absichtlich) nicht funktioniert.
Der Befehl command holt sich die aktuellen Verbrauchsdaten mit curl vom Shelly ab und formatiert sie mit jq so um, daß die Zeile "total 2342" rauskommt (wenn der Zählerstand 2342 ist).
Das format sagt, daß zuerst der Identifier ("total"), dann ein Leerzeichen und dann der Zählerstand ("2342") kommt. Ich hatte es ohne Identifier probiert und das format nur auf "$v" gesetzt, aber dann hat der vzlogger nicht mitbekommen, daß Daten vorhanden waren:
[Mar 26 13:00:02][exec] MeterExec::read: Closing process 'curl -s http://shellyplug1/meter/0 | jq -r .total'' [Mar 26 13:00:02][mtr3] Stopped reading. [Mar 26 13:00:02][chn4] ==> number of tuples: 0 [Mar 26 13:00:02][chn4] JSON request body is null. Nothing to send now.
Mit diesen Einstellungen schreibt der Logger jetzt brav aller 10 Minuten die Verbrauchswerte für die fünf ShellyPlugS in die Datenbank.
Der Befehl für einen Shelly PM Mini Gen3
ist
(API-Doku):
Das + 12412868 habe ich eingebaut,
weil ich von einem Shelly Plug S
auf einen
Shelly PM Mini Gen3
umgestiegen bin und der Absolutwert
in der Datenbank fortgeführt werden musste.
Ohne die Anpassung kommt es zu einem krass Sprung von -154kW
beim Wechsel vom alten zum neuen Zähler.
Außerdem muss man im Frontend beim Kanal die Auflösung auf 1000/kWh setzen, weil der PM Mini den Gesamtverbrauch in Wattstunden zurückgibt, und nicht in Wattminuten.
Aus diesem Grund ist es auch besser, wenn man beim Wechsel von Shelly Plug auf Shelly PM Mini einen neuen Kanal anlegt, weil sich die Basiseinheit geändert hat.
Die Daten wurden nun mitgeloggt und auch im Browser hübsch angezeigt. Was mir fehlte war noch eine Anzeige, wieviel des verbrauchten Stroms nicht gemessen wird.
Dazu legte ich einen "Verbrauchssensor (virt.)" an. In die Felder für die Eingänge schreibt man die UUIDs der Kanäle, und bei "Regel" die Berechnung:
val(in1)-val(in2)-val(in3)
Hier wird der Wert on Eingang 1 als Basis genutzt und dann die Werte von Eingang 2 und 3 abgezogen. So sehe ich, wieviel "unbekannten" Strom noch im Haus verbraucht wird.
Ich habe 2 weitere virtuelle Sensoren definiert, in denen ich jeweils 4 Messwerte zusammengerechnet habe (weil das Webinterface nur Felder für 4 Eingänge anzeigt). Diese habe ich dann im 3. virtuellen Sensor final vom Gesamtstrom abgezogen.
Published on 2022-03-30 in hardware, server
The PlayJam GameStick community server software got another feature: Purchases. You are now able to buy games (instead of having all of them available for free) and in-game products like levels and powerups.
Your wallet has an infinite amount of money, so you don't risk going broke :)
All games - even already installed ones - have to be bought now. After buying, the game download starts automatically.
The purchase dialog is a web view, displaying a HTML page delivered by the server. I had no idea how it looked like - there were no screenshots to find with my Google-Fu. In the end I found a video of Lee Chapman demoing the Gamestick, and near the end he buys Riptide.
I took screenshots, resized and warped them until they had the correct aspect ratio and size. Then I re-built the layout in HTML and CSS that a 2013 browser understands.
There was no documentation about the purchase requests and responses. The requests were easy to document since I could see them in the server logs, but the responses were hard: Some of them are handled in the Java library, while others are passed to the Marmalade UI and parsed there. The important things like "success, download now" were of course in the compiled C code, and I was forced to use Ghidra to make a bit sense of it.
The magic words are:
{
"body": {
"success": true,
"message": null,
"action": "CLOSEPAYMENT"
}
}
Implementing purchases fixed a long-standing bug: The "uninstalled apps" view in the settings crashed, probably the Marmalade interface was never meant to handle 188 games. Now only the purchased games are listed there - without crashing.
A number of games have in-game products: "Top Gear: Stunt School" allows to buy nuts, dollars and permits. In "Pacman Tournaments" you can buy tokens (3500 for 99.99USD!), "Rise of Glory" lets you spend money on airplane packs and in Prince of Persia you can buy coins (1000 for 1.99, 100000 for 99.99$).
Of course we did not have backups and I had to decompile the game apk files to find the product IDs that they used. Products had to be registered at the server, and the game only asks the server which products are available.
More often than not, decompiling did not work because the game was made with Unity or some other engine, and I miss the tools to unpack those files. In this cases I let the server return all products ids from 1 to 1000, with prices from 0.01€ to 10.00€, and could immediately see which products were used. This did of course only work on some games; others crashed when they received more than 15 products.
OUYA games were much easier in this regard: They send all supported product keys to the server, making it a breeze to quickly add products for unsupported games. Although, easier only after I broke their DRM :)
At one point I was finished and had only find products for the last game, Repulze. Then I saw that - instead of sending integer number product IDs, just as all other games do - this game sends string keys like com.pixelbite.repulze.iap.toolkit_pack1! I had to modify the database, parts of the purchase API and the game data schema to support that :(
But now this feature is really complete, and you can purchase things in the following games:
In 2024-09 we had 163 of 188 games archived. Thanks to GameStick fans Kazdan, Krzysiu, Ryo and TheMartinMess22 we have 170 now, a whopping 90.4%!
Newly rescued games:
Published on 2025-06-25 in gamestick
I've been using my Purism Librem 13v3 laptop daily for nearly 8 years, and now the left screen hinge mounts broke on the screen side.
I noticed it when closing the lid gave away cracking sounds. The closed screen is not aligned with the bottom case anymore; I can see a bit of the body.
Other people
had the same problem
with what Purism once advertised as super sturdy hinge
:
Designed to last, reinforced metal, mounted directly to the case and screen
We get excited about hinges. Often overlooked by inadequate laptop makers, our hinge is built to be sturdy for life, staying shut when shut, and staying put in any of the 130° of screen angle while in use.
The screen hinge was never the best compared to experiences with e.g. a Macbook Air - tipping the screen a bit, or having some bumps while riding the train would wobble the screen back and forth a bit.
I contacted Purism support and they asked me to verify that the motherboard mounts are still ok - it's a common problem that when the screen's hinge mounts broke off, the motherboard ones follow suit:
It looks like you need a new display, however, if the screw mounts are cracked, then it will break on the keyboard side as soon as the new display is installed.
Please inspect the screw mounts for damage. If they are cracked, please prepare some epoxy glue and ensure that the screw mounts are properly aligned. Once they are aligned, please apply the glue in a couple of thin layers, letting it dry for a day or two between applications.
Support also gave me a price: USD $366.89 ($299.00 Librem 13 v3 screen, $67.89 shipping to, Germany).
My internal limit I set before contacting support was 100$, maybe plus a bit shipping, but over 300 is too much. I'll buy a new laptop, this time from a different manufacturer.
I had a number of problems with this laptop. Some of them still occur today, which is part of why I won't repair it or buy a new one from Purism:
Bottom case screws fell off before I ever tried to open it.
When waking from sleep, the laptop CPU fan sometimes blasted to full speed, while the CPU itself was awful slow.
Could be fixed by sleeping and waking again.
Wifi driver stop working every now and then, spamming dmesg full of messages:
ath: phy0: Failed to wakeup in 500us ath: phy0: RX failed to go idle in 10 ms RXSM=0xffffffff ath: phy0: DMA failed to stop in 10 ms AR_CR=0xffffffff AR_DIAG_SW=0xffffffff DMADBG_7=0xffffffff
I had to reboot when I noticed this problem, which often was on the train to/from work.
Left Ctrl, Shift, S and up/down arrow keys have their black paint removed probably because of fingernails and heavy use.
Rubber foot fell off
Internal microphone is awful
The screen gets more and more grey smudges below the top screen layer, which can't be wiped off. It's like dead pixels, but in grey instead of black.
And now the broken hinge
What I still like are the hardware switches for webcam+microphone and bluetooth+wifi and that the system runs coreboot.
Apart from that, there is nothing that would want me get a Purism device again.
Published on 2025-06-08 in hardware
2015 oder 2016 wollte ich Kopfhörer kaufen und entschied mich für Sennheiser HD 461, weil sie von einer Marke mit gutem Leumund waren. Jetzt im Jahre 2025 löste sich das Wildlederimitat der Ohrpolster auf und fiel auseinander:
Der Sennheiser-Support meinte, daß ich die Köpfhörer wegwerfen muss:
Leider haben wir keine Ersatzpolster mehr für HD 461.
Auch Ohrpolster anderer Kopfhörer sind leider nicht kompatibel.
So einfach wollte ich mich aber nicht geschlagen geben und fand in einem Onlineshop folgenden Produkttitel:
Sennheiser HD461 / HD471 / HD429 / HD200 / HD201 / HD200Pro Official Replacement Ear Pads
Also sind die Ohrpolster der HD 200 Pro kompatibel bzw. die gleichen wie für die HD 461?
Ich bestellte die Ersatzohrmuschelpolster für insgesamt 23,39€ auf einer deutschen Onlineshopseite, bei der "Lieferung aus Schweden" stand. Auf der Rechnung stand dann eine Firma aus Großbritannien, und auf dem Kopfhörer "made in China".
.. aber die Ersatzpolster passten! Wieder etwas Elektroschrott vermieden.
Published on 2025-05-28 in hardware