Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Mini-guide: Hvordan bruke Modbus (med HomeSeer)


Moskus

Anbefalte innlegg

22 hours ago, JxxxIxxx said:

 

Noen av gangene hjalp det å restarte plugin'en, men ellers så kom feilene opp igjen bare sekunder etter at jeg hadde enablet plugin igjen s¨å det har ikkje vært konsistent.

For øyeblikket har jeg gitt litt opp og har disablet plugin'en.

Jeg mistenker også at problemet kan være en ustabilitet i mobus-adapteren som gjør at HS mister kontakten med den.

Den første gangen jeg fikk problemet så var adapteren heller ikke mulig å nå via web browse eller ping eller noe annet, og jeg måtte ta strømmen på den for å få den opp igjen. Men senere har pluginen i HS feilet uten at adapteren har vært offline, jeg har kunnet aksessere adapteren fra nettleser f.eks., mens HS gir feilmeldinger, så symptomene er ikke konsistente.

Jeg har en annen Modbus-adapter av en litt annen type som jeg kanskje kommer til å prøve når jeg får litt ledig tid.

Jeg har også en IAM (Internet Access Module) tilkoblet aggregatet og denne kan stilles om til å fungere som en modbus adapter, men da mister jeg kontroll via app og det har jeg lyst til å beholde av ulike grunner.

 

For å teste stilte jeg om IAM fra Cloud til Modbus. Det var litt vanskelig å få kontakt fra HS, siden det ikke stod i dokumentasjonen hvilken port den kommuniserte på, men her i tråden fant jeg at det var 502 og da hadde jeg kontakt.

Jeg hadde bare konfigurert ett register i HS (Active User Mode) for å teste. Initielt så det ut som det fungerte, devicen oppdaterte seg til riktig verdi, men så begynte feilmeldingene å hagle. Andre meldinger enn med den andre Modbus-adapteren.

Error in ReadValue: Exception of type 'Modbus.SlaveException' was thrown. Function Code: 132 Exception Code: 1 - The function code received in the query is not an allowable action for the server (or slave). This may be because the function code is only applicable to newer devices, and was not implemented in the unit selected. It could also indicate that the server (or slave) is in the wrong state to process a request of this type, for example because it is unconfigured and is being asked to return register values.

Så ingen suksess dette heller.

Uansett så var det ikke meningen å bruke IAM som Modbus-adapter, så jeg kommer nok til å stille den tilbake til Cloud-modus, da har jeg i alle fall litt styring på aggregatet.

Jeg får se om jeg orker å bruke mer tid på å teste den andre Modbus-adapteren. Jeg har egentlig ikke kunnskap nok til å vite hva jeg skal gjøre for å debugge det oppsettet og det er grenser for hvor mye tid jeg kan bruke på dette.

Litt irriterende at det ser ut som jeg ikke klarer å koble aggregtet til HS, det var en de tingene jeg hadde sett fram til å gjøre når jeg likevel måtte bytte ventilasjon.

 

 

Lenke til kommentar
Del på andre sider

1 hour ago, Moskus said:

Det finnes Modbus-debuggere som du kan kjøre istedenfor å prøve deg på HS hele tiden. Tipper det blir enklere i lengden.

 

Det er jo det jeg må prøve hvis ikke annet virker, men jeg er vel ikke så motivert til å bruke tid på sette meg inn i enda flere for meg ukjente teknologier.

Jeg er også usikker på hvor jeg skal lete etter problemet. Slik jeg forstår det kan det være et problem mellom HS og adapteren, eller et problem internt i adapteren, eller i kommunikasjonen mellom adapteren og aggregatet. Det er en del ting som tyder på at det er det siste (se under).

Etter min forrige mislykkede test med IAM-adapteren som Modbus-adapter, satte jeg i går kveld denne tilbake til Cloud og slo på igjen USR-TCP232-410S adapteren og omkonfigurerte HS igjen til å bruke denne. Også nå skjedde det samme som tidligere, den virket umiddelbart, men etter en stund (kanskje en time, jeg fulgte ikke med hele tiden), krasjet alt og feilmeldinger haglet i loggen. Nå var det igjen ikke mulig å nå adapteren på noen måte. Jeg disablet plugin og slo av og på adapteren. Adapteren kom opp igjen og kunne nåes via nettet, men hvis jeg slo på igjen pluginen så feilet den etter bare sekunder. Dette kan kanskje tyde på det som var nevnt av noen tidligere, at adapteren "spammer" aggregatet med så mye forespørsler eller feil at det "stenger ned" Modbus-kommunikasjonen for en lengre periode.

Jeg slo av plugin og adapter over natten og slo dem på igjen i dag tidlig, og da virket alt igjen. Denne gangen endret jeg på noen parametre. Jeg satte "Delay between each address poll" til 500ms (default er 0). Jeg stilte også om baud rate i adapter og aggregat fra 115200 til 9600. Mulig akkurat dette siste ikke er helt lurt, men tenkte å gjøre kommunikasjonen litt mindre "følsom". Adapteren er koblet til aggregatet med en 12-15 meter lang CAT6 nettverkskabel, på samme måte som vist i guiden. Vet ikke hvor følsom Modbus er for lengder og type kabel.

Uansett så har jeg nå alt oppe å gå på tredje timen uten feilmeldinger, noe som er lovende. Men det er ikke nødvendigvis sikkert problemet er løst. Tross alt så virket alt i nærmere et halvt døgn den aller første gang jeg prøvde, så vi får se hva som skjer over tid nå.

Jeg har nå definert devicer mot 6 ulike register, så pluginen poller aggregatet 6 ganger hvert 10.sekund. Alt fungerer tilsynelatende som det skal, verdier oppdaterer seg hvis jeg endrer innstillinger i aggreagtets styrepanel, og jeg kan kontrollere viftenåvå og "User mode" fra HS.

 

 

 

 

 

 

Lenke til kommentar
Del på andre sider

2 hours ago, JxxxIxxx said:

 

......

Jeg slo av plugin og adapter over natten og slo dem på igjen i dag tidlig, og da virket alt igjen. Denne gangen endret jeg på noen parametre. Jeg satte "Delay between each address poll" til 500ms (default er 0). Jeg stilte også om baud rate i adapter og aggregat fra 115200 til 9600. Mulig akkurat dette siste ikke er helt lurt, men tenkte å gjøre kommunikasjonen litt mindre "følsom". Adapteren er koblet til aggregatet med en 12-15 meter lang CAT6 nettverkskabel, på samme måte som vist i guiden. Vet ikke hvor følsom Modbus er for lengder og type kabel.

Uansett så har jeg nå alt oppe å gå på tredje timen uten feilmeldinger, noe som er lovende. Men det er ikke nødvendigvis sikkert problemet er løst. Tross alt så virket alt i nærmere et halvt døgn den aller første gang jeg prøvde, så vi får se hva som skjer over tid nå.

......

 

 Fem timer gikk det, så krasja det igjen, samme feilmeldinger. ☹️

Lenke til kommentar
Del på andre sider

1 hour ago, bergen77 said:

Kan du redusere antall verdier du poller, for eksempel til en verdi og polle annet hvert sekund?

 

Ok, slo på igjen adapteren, og enablet plugin igjen. Disablet alle register-devicer unntatt en og satte poll til 2 sekunder.

Foreløpig ingen feilmeldinger.

Lenke til kommentar
Del på andre sider

16 hours ago, bergen77 said:

Kan du redusere antall verdier du poller, for eksempel til en verdi og polle annet hvert sekund?

 

Nå har den gått feilfritt i 15 timer med polling av ett register annethvert sekund, så det er jo lovende. Men lar den gå i alle fall til i kveld før jeg føler meg trygg på at det er stabilt.

Hvis dette er stabilt så antar jeg at jeg kan polle mer enn ett register hvis jeg passer på at "Delay between each address poll" er minst 2 sekunder? (må da også naturligvis øke tiden mellom hver poll tilsvarende).

Dette betyr vel at dersom jeg f.eks. poller hvert 10. sekund med 2 sekund delay mellom hvert register så kan jeg ikke polle mer enn maks 5 forskjellige register.

 

 

 

Lenke til kommentar
Del på andre sider

Kan du ikke polle hvert minutt da? Hvilke verdier er det som er så viktigr at du må ha de oppdatert hvert 10 sekund? Verdiene i ett ventilasjonssggregat vil ikke endre seg så mye, de er mer eller mindre konstant, med unntak av temp. Og temp endrer seg ikke hvert 10 sekund.

Lenke til kommentar
Del på andre sider

59 minutes ago, MrE said:

Kan du ikke polle hvert minutt da? Hvilke verdier er det som er så viktigr at du må ha de oppdatert hvert 10 sekund? Verdiene i ett ventilasjonssggregat vil ikke endre seg så mye, de er mer eller mindre konstant, med unntak av temp. Og temp endrer seg ikke hvert 10 sekund.

Det stemmer at jeg ikke behøver å polle så ofte for de registerne jeg bare leser. Men det er noen register ikke bare er read-only, de lar meg styre aggregatet (viftehastighet, såkalt "user mode" og noen andre parametre), og med en lav pollefrekvens vil det ta tid før det reagerer. Dette er i seg selv ikke så kritisk dersom det bare er snakk om noe jeg styrer basert på schedule/tid/tilstand, f.eks. skru ned eller opp vifterhastighet morgen/kveld eller basert på om det er noen hjemme eller ikke. Men jeg hadde f.eks. også en ide om at jeg kunne installere en knapp på badet som man kunne trykke på før man dusjer og som gir en 15 minutt "boost" på ventilasjonen. Men når jeg tenker meg om så er det vel ikke kritisk om dette gir umiddelbar respons heller.

Så ja, det er vel kanskje ikke nødvendig å polle hvert 10.sekund. Men i den opprinnelig guiden var det en verdien som var brukt og i følge @Moskus hadde Systemair sagt at man kunne polle hvert sekund om man ønsket. men dette fungerer tydeligvis ikke hos meg.

 

 

 

 

Lenke til kommentar
Del på andre sider

40 minutes ago, JxxxIxxx said:

Så ja, det er vel kanskje ikke nødvendig å polle hvert 10.sekund.

Jeg gjør det. Mest fordi hvert sekund var noe overdrevet, jeg fikk ikke bedre informasjon av å polle så mye, bare mer av den.

 

Men hvis det fungerer med et minutt, så hold deg til det. Som sagt av andre; temperaturer endrer seg ikke så mye, ventilasjon er et relativt tregt system.

Lenke til kommentar
Del på andre sider

Jeg poller hvert 5 minutt. og grafene i Grafana inneholder mer enn nødvendige punkter. :)

 

For forsert ventilasjon bruker jeg dobbelt fibaro rele som styrer fukt på bad og bruk av platetopp med ventilator.

Modbus brukes til grafert og styre borte/hjemme modus.

Lenke til kommentar
Del på andre sider

On 11/07/2021 at 12:10, JxxxIxxx said:

Det stemmer at jeg ikke behøver å polle så ofte for de registerne jeg bare leser. Men det er noen register ikke bare er read-only, de lar meg styre aggregatet (viftehastighet, såkalt "user mode" og noen andre parametre), og med en lav pollefrekvens vil det ta tid før det reagerer. Dette er i seg selv ikke så kritisk dersom det bare er snakk om noe jeg styrer basert på schedule/tid/tilstand, f.eks. skru ned eller opp vifterhastighet morgen/kveld eller basert på om det er noen hjemme eller ikke. Men jeg hadde f.eks. også en ide om at jeg kunne installere en knapp på badet som man kunne trykke på før man dusjer og som gir en 15 minutt "boost" på ventilasjonen. Men når jeg tenker meg om så er det vel ikke kritisk om dette gir umiddelbar respons heller.

Så ja, det er vel kanskje ikke nødvendig å polle hvert 10.sekund. Men i den opprinnelig guiden var det en verdien som var brukt og i følge @Moskus hadde Systemair sagt at man kunne polle hvert sekund om man ønsket. men dette fungerer tydeligvis ikke hos meg.

 

 

Nå ha det gått stabilt i over to døgn. Jeg poller 6 registre hvert 30.sekund med et delay på 2.5 sekunder mellom hvert register. Det er tydligvis dette siste som har vært avgjørende for at mitt oppsett skal gå stabilt. Når jeg polla registerne for tett etter hverandre krasja det etter en stund.

For sikkerhets skyld kommer jeg til å sette strømforsyningen til Modbus-adapteren på en ZWAVE-bryter og lage eventer som gjør at jeg kan disable plugin'en og slå av adapteren og enable pluigin'en og slå på igjen adapteren. Da har jeg i alle fall muligheter til å stoppe/resette hvis det skulle oppstå en feilsituasjon.

 

 

En annen funksjon som kunne være nyttig for meg er å få HS til å gi meg et varsel når det nærmer seg tid for å bytte filter.

Jeg ser i Modbus-dokumentasjonen for aggregatet at det er register for gjenstående tid før filterbyte, angitt i antall sekunder (!)  (hadde ikke dager vært mer enn godt nok?). Men gjenstående tid er delt opp i to register, "lower 16 bits" og "higher 16 bits". Er det noen som kan gi meg et tips på hvordan jeg enklest kan slå disse to sammen til en device som har gjenstående tid som ett enkelt tall (fortrinnsvis i dager)?

Endret av JxxxIxxx
Lenke til kommentar
Del på andre sider

  • 3 måneder senere...

Jeg trenger litt hjelp... jeg skjønner ikke hva som er feil.

Jeg har ett Save VSR 500 fra 2017.

Kjøpte https://www.aliexpress.com/item/1005001541665232.html 

Får fint kontakt med Modbus adapteret over nettverket (TCP)

Ganske sikker på at jeg har kontakt/får svar fra ventilasjonsanlegget også:

simulator.thumb.JPG.5071b177a00d71aabbfb128059056fd3.JPG

Her spør jeg Device: 1 og input register på adresse 215 (skal være temp sensor på tilførselluft (ute temp)).

Får ett svar av noe slag, jeg klarer ikke å tyde noe fornuftig ut av svaret riktignok, og verdiene endrer seg ikke, noe man skulle tro de ville gjort iogmed at det skal være en temp sensor.

 

Men hvis jeg legger inn tilsvarende verdier i HS så skjer det ingenting...

44364605_devicelist.JPG.c2aeeb334ad467d3a736343b93f42e9a.JPG

 

oversikt.thumb.JPG.ea544e6ea4d42e2e3223d1f73995bca0.JPG

 

178511850_modbusconfig.JPG.67c2395bdb3fee6326f12c70a1a35732.JPG

 

1607720062_configinputregister.JPG.0755148c537b376c8789781d50cf5c84.JPG

 

Virker ikke som den oppdaterer noe som helst (se dato på siste oppdatering, 1929 ;) )

 

Hvis jeg kjører discovery i CAS modbus scanner på TCP så får jeg kun timeout.

Så installerte jeg USR-VCOM serial port server som fulgte med modbus-ethernet adapteret og opprettet virtuell COM2 port på TCP adressen. Får kontakt med adapteret, og da får jeg også kontakt verdier på Device 1 (Not available, Divice exists, .... ) på alle 4 functions.

 

discovery.JPG.2e67cb74c610ce68b44be5eb9b3e01ae.JPG

 

Men får fortsatt ingen svar når jeg "Poll"'er på de forskjellige...

 

poll.JPG.dd35867d4a55f594ea3fe5acdebed6ba.JPG

 

Og i HomeSeer er det heller ingen forskjell..

 

Jeg har tidligere brukt Z-Wave adapteret til Systemair, som fungerte, men syntes ikke jeg får noe fornuftig ut av det (er bla. ute etter temperatur sensorene slik at jeg kan se virkningsgrad, sammen ligne med temp i rommet den suger fra og se hvor mye tap jeg har i rør føring, osv.). Z-Wave adapteret fungerte - men kan det være grunnen til at jeg ikke får noe fornuftig ut av den nå? Har den "bindet" seg til det adapteret?

Vurderer en factory resett av ventilasjonsaggregatet, men da må alt stilles inn på nytt 😛 (kan jo bare skrive ned verdiene, så ikke noe stort problem).

 

Jeg er også usikker på hvilke modbus adresser jeg faktisk skal bruke, makitech og systemair svarer meg ikke pr. epost. men jeg har prøvd å pulle på samtlige adresser uten å få svar så tror det problemet kommer senere..

modbustester.thumb.JPG.c77be8cb2a8ae1fe8eb854b45a475ad5.JPG

 

 

modbus config.JPG

Lenke til kommentar
Del på andre sider

14 minutes ago, flyingdingy said:

Jeg er også usikker på hvilke modbus adresser jeg faktisk skal bruke, makitech og systemair svarer meg ikke pr. epost.

Der måtte jeg bruke en god del tid, for det kan variere fra versjon til versjon (av aggregatet).

Lenke til kommentar
Del på andre sider

Først anbefaler jeg å oppdatere SW på aggregat, slik at du er sikker på at siste adresseliste er gjeldende.

 

Ser du bruker 12103 for utetemp, 12102 er vel utetemp og 12103 er tilluft, og så må du bruke holding for å lese. Input er for å skrive.

 

image.png.619ad3148aacae1eb3afdbc72413624f.png

Endret av MrE
Lenke til kommentar
Del på andre sider

Er det noen som har fått MODBUS-kabelen som alt henger på Flexit Nordic S4 til å fungere (da med et forholdsvis nytt anlegg - mitt er fra høsten 2020)?  Eller må man ha ledningssettet i tillegg?  

 

Og jeg forstår heller ikke helt hva ledningssettet gjør, da det virker som dette er en helt passiv komponent som mer er et adapter fra en kontakt-type til en annen. Kan man ikke da bare koble på de tre Modbus-kablene direkte på hovedkortet?

Endret av TH3
Lenke til kommentar
Del på andre sider

TH3 skrev (42 minutter siden):

Er det noen som har fått MODBUS-kabelen som alt henger på Flexit Nordic S4 til å fungere (da med et forholdsvis nytt anlegg - mitt er fra høsten 2020)?  Eller må man ha ledningssettet i tillegg?  

 

Og jeg forstår heller ikke helt hva ledningssettet gjør, da det virker som dette er en helt passiv komponent som mer er et adapter fra en kontakt-type til en annen. Kan man ikke da bare koble på de tre Modbus-kablene direkte på hovedkortet?

Hei. Jeg har flexit S4 nordic, eldre modell (før 2018/2019? Hadde ikke modbus mulighet direkte på hovedkortet og jeg måtte bytte hovedkort). 

Kabelsettet som du beskriver kobles til egen utgang på hovedkortet og tilgjengeliggjør en del nye porter, deriblant modbus.  Den standardkabelen på aggregatet merket med modbus kunne ikke brukes fikk jeg beskjed om. 

Knotet litt for få det i gang etter at alt vr koblet. Men etter at det kom opp å kjøre så funker det fint og stabilt. 

Jeg bruker logic machine/ wiser i andre enden og som logikk. 

 

FlexitGo appen har vært mer ustbil (virker som nettilgangen til aggregatet ramler ut). Men har ikke hatr behov for appen etter modbus kom opp å kjøre. 

 

Endret av stemic01
Lenke til kommentar
Del på andre sider

  • 2 uker senere...
MrE skrev (På 14.10.2021 den 9.00):

Først anbefaler jeg å oppdatere SW på aggregat, slik at du er sikker på at siste adresseliste er gjeldende.

 

Ser du bruker 12103 for utetemp, 12102 er vel utetemp og 12103 er tilluft, og så må du bruke holding for å lese. Input er for å skrive.

 

image.png.619ad3148aacae1eb3afdbc72413624f.png

Hvordan får jeg oppdatert SW på aggregatet...? regner med jeg må ha ett adapter av noe slag også må jeg jo få kloa i selve programvaren/firmware/update...

Endret av flyingdingy
Lenke til kommentar
Del på andre sider

@flyingdingy

Jeg regner med du har satt opp adapteret korrekt slik at det klarer å lese aggregatet.

I CAS modbus scanner prøv discover funksjon over tcpip, husk og sett porten riktig.

 

Du skal få MYE mer resultater enn det du får. Det ser ikke ut som adapteret har kontakt med aggregatet.

Lenke til kommentar
Del på andre sider

Jeg bruker ett RJ-45 til RS485 adapter: https://www.aliexpress.com/item/1005001541665232.html

Får fint kontakt med det via web grensesnittet på TCP.

Har prøvd direkte mot TCP på port 8432, 502 og via virtuelt COM.

 

Jeg begynner rett og slett å mistenke at adapteret mitt ikke er kompatibelt på ett eller annet vis - er det noe sted i Norge man får tak i ett adapter (helst TCP, men kan klare seriell også hvis jeg må), ev. hvis noen har ett adapter de vet fungerer med en link til spesifikt adapter (aliexpress / ebay e.l.) som jeg kan bestille? - kommer til å ta noen måneder hvis det er fra kina riktignok ;)

 

I CAS modbus scanner får jeg Timeout på hele fløya. TCP er satt opp med riktig IP og port..

Har prøvd for feilsøkingens del å bytte om på A / B ledning også, men det hjalp ikke (og jeg er 99% sikker på at jeg har den riktig)

 

Endret av flyingdingy
Lenke til kommentar
Del på andre sider

  • 4 uker senere...

Hei.

Jeg har gjort en endring i systemet mitt, og kunne da ikke lenger bruke kommunikasjonskortet for MODBUS jeg har brukt frem til nå. Tenkte derfor å selge det. Litt dyrere enn Ali-løsningene, men dog av industrikvalitet, og direkte i PCen. Kan også kommunisere med langt flere enheter. Det er også to porter på kortet.

 

Link til produktet: https://www.moxa.com/en/products/industrial-edge-connectivity/multiport-serial-boards/pcie-upci-pci-serial-cards/cp-132ul-series

 

Annonse ligger på finn.no

Lenke til kommentar
Del på andre sider

  • 1 måned senere...
flyingdingy skrev (På 13.10.2021 den 14.24):

Her spør jeg Device: 1 og input register på adresse 215 (skal være temp sensor på tilførselluft (ute temp)).

Får ett svar av noe slag, jeg klarer ikke å tyde noe fornuftig ut av svaret riktignok, og verdiene endrer seg ikke, noe man skulle tro de ville gjort iogmed at det skal være en temp sensor.

 

 

 

Verdiene du får ut er faktisk riktige, men er i et helt spesielt format. De virker helt "crazy", men må konverteres til flyttall via så kalt "high byte".  Følgende kode (JavaScript) gjorde susen:

 

   toFloat(data) {
        let pay = data;
        const buf = Buffer.allocUnsafe(4)
        buf.writeUInt16BE(pay[0]); 
        return Number(buf.readFloatBE(0).toFixed(0));
    }

Endret av TH3
skrivefeil.
Lenke til kommentar
Del på andre sider

Kan nå bekrefte at en USR-TCP232-410S og ledninssettet (116405) fungerer overraskende godt mot Flexit Nordic S4 ved hjelp av den gode guiden i starten av denne forum-tråden.

 

Etter å ha fått luket ut en rekke problemer med datatyper og konverteringer, så har jeg nå fått meg en liten egensnekkret Homey-app for anlegget:

 

Screenshot_20220113-140517_Homey.thumb.jpg.d1a5ed31bf1f5a234a7673f806d5ec1d.jpg

 

Screenshot_20220113-140522_Homey.thumb.jpg.4243f31ec260761706453286cfe13328.jpg

 

 

Må si jeg er utrolig skuffet over kundeservice hos Flexit, og hvor lite hjelpsomme de er på dette området. Bl.a. påstod de at det ikke fantes noen oversikt over modbus-registerne. Heldigvis fant jeg tilfeldigvis et Excelark (laget av Flexit selv) som noen hadde henvist til i denne forum-tråden tidligere.

 

(Et tips er også til andre som skal forsøke det samme:  Kjøp ledningssettet hos en nettbutikk som forhandler Flexit, ikke direkte hos Flexit. Flexit tar av en eller annen grunn vesentlig mer for det selv)

 

Endret av TH3
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.